#include <stdio.h>
#include <stdlib.h>

// 定义循环队列数据结构
typedef struct{
  int *data; //指向动态数组指针
  size_t size; // 队列中有效元素的个数
  size_t capacity; // 动态数组容量
  size_t front;   // 队列头指针
  size_t rear; // 队列尾指针
} Queue;

void initQueue(Queue *queue,size_t capacity){
  queue->data = (int *)malloc(capacity*sizeof(int));
  queue->size=0;
  queue->capacity=capacity;
  queue->front=0;
  queue->rear=0;
}

size_t getSize(Queue *queue){
  return queue->size;
}

void enqueue(Queue *queue, int element){
  if(queue->size==queue->capacity){
    printf("队列已满，添加失败");
    return;
  }
  queue->data[queue->rear] = element;
  // rear指针向后移动 rear++
  // 循环队列取模大法
  queue->rear = (queue->rear+1)%queue->capacity;
  queue->size++;
}

int dequeue(Queue *queue){
  if(queue->size==0){
    printf("队列为空，出队失败");
    return -1;
  }
  int val = queue->data[queue->front];
  // 移动头指针到下一位置，表示当前的被删除了
  // 循环队列头指针更新大法
  queue->front =(queue->front+1)%queue->capacity;
  queue->size--; // 更新元素个数
  return val;
}

void printQueue(Queue *queue){
  for (int  i = queue->front,j=0; j < queue->size; j++,i++){
    // 使用正确下标进行遍历
    printf("%d ",queue->data[i%queue->capacity]);
  }
  printf("\n");
}

void destroyQueue(Queue *queue){
  free(queue->data);
  queue->data=NULL;
  queue->size=0;
  queue->capacity=0;
  queue->front=0;
  queue->rear=0;
}

int main(void){
  Queue queue;
  initQueue(&queue,4);
  enqueue(&queue,1);
  enqueue(&queue,2);
  enqueue(&queue,3);
  enqueue(&queue,4);
  printf("size:%zu\n",getSize(&queue));
  printQueue(&queue);
  dequeue(&queue);
  printQueue(&queue);
  dequeue(&queue);
  dequeue(&queue);
  dequeue(&queue);
  //dequeue(&queue);
  printQueue(&queue);
  destroyQueue(&queue);
  return 0;
}
